﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FeiYang
{
    public class 商城_
    {
        private static bool 充值回馈是打开的(挂机人物_ 人物)
        {
            var 找到 = 月卡或封号礼包可能打开了(人物) &&
                其他_.循环判断(() =>
                {
                    return 图像_.查找文字(419, 561, 566, 583, s
                        => s.Contains("累计充值")).X != -1;
                }, 2);
            if (找到) 人物.输出("充值回馈是打开的");
            return 找到;
        }
        private static bool 元宝或金币商城打开了(挂机人物_ 人物)
        {
            var 结果 = 月卡或封号礼包可能打开了(人物) &&
                其他_.循环判断(() => 图像_.查找文字(339, 574, 420, 597, s => s.Contains("元宝余额")).X != -1, 2);
            if (结果) 人物.输出("元宝商城是打开的");
            return 结果;
        }

        private static bool 打开充值回馈(挂机人物_ 人物)
        {
            if (!充值回馈是打开的(人物))
            {
                键鼠_.左键单击(1032, 80);
                var 找到 = 其他_.循环判断(() =>
                {
                    return 图像_.查找文字(419, 561, 566, 583, s
                        => s.Contains("累计充值")).X != -1;
                }, 2);
                其他_.延迟(其他_.时长_400);
                if (!找到) throw new Exception("充值回馈打开失败");
                return 找到;
            }
            return true;
        }

        private static bool 打开元宝商城(挂机人物_ 人物)
        {
            if (!元宝或金币商城打开了(人物))
            {
                人物.输出("打开元宝商城");
                var 找到 = 打开充值回馈(人物);
                if (!找到) throw new Exception("充值回馈打开失败");
                键鼠_.左键单击(995, 354);

                找到 = 其他_.循环判断(() => { return 图像_.查找文字(339, 574, 420, 597, s => s.Contains("元宝余额")).X != -1; }, 2);
                其他_.延迟(其他_.时长_400);

                if (!找到) throw new Exception("商城打开失败");
                return 找到;
            }
            键鼠_.左键单击(373, 252);
            其他_.延迟(其他_.时长_400);
            return 其他_.循环判断(() => 图像_.查找文字("金砖", 623, 283, 660, 302).X != -1, 2);
        }

        public static bool 购买金条(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开元宝商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            其他_.延迟(其他_.时长_400);
            键鼠_.左键单击(435, 291);
            找到 = 其他_.循环判断(() => 图像_.查找文字("金条", 616, 268, 664, 291).X != -1, 2);
            if (!找到) throw new Exception("没找到金条");
            其他_.延迟(其他_.时长_400);
            for (var i = 1; i < 数量; i++)
            {
                键鼠_.左键单击(743, 435);
                其他_.延迟(其他_.时长_400);
            }
            键鼠_.左键单击(644, 512);
            其他_.延迟(其他_.时长_1000);
            找到 = 其他_.循环判断(() => 图像_.查找文字("金条", 616, 268, 664, 291).X != -1, 2);
            if (找到) throw new Exception("没能关闭小的购买窗口");
            return !找到;
        }

        public static bool 购买金砖(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开元宝商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            其他_.延迟(其他_.时长_400);
            键鼠_.左键单击(643, 291);
            找到 = 其他_.循环判断(() => 图像_.查找文字("金砖", 616, 268, 664, 291).X != -1, 2);
            if (!找到) throw new Exception("没找到金砖");
            其他_.延迟(其他_.时长_400);
            for (var i = 1; i < 数量; i++)
            {
                键鼠_.左键单击(743, 435);
                其他_.延迟(其他_.时长_400);
            }
            键鼠_.左键单击(644, 512);
            其他_.延迟(其他_.时长_1000);
            找到 = 其他_.循环判断(() => 图像_.查找文字("金砖", 616, 268, 664, 291).X != -1, 2);
            if (找到) throw new Exception("没能关闭小的购买窗口");
            return !找到;
        }

        public static bool 购买元宝商城物品(挂机人物_ 人物, List<物品及数量_> 物品)
        {
            foreach (var a in 物品)
            {
                if (a.名称 == "金砖")
                {
                    var 结果 = 购买金砖(人物, a.数量);
                    if (!结果) return false;
                }
                else
                {
                    var 结果 = 购买金条(人物, a.数量);
                    if (!结果) return false;
                }
            }
            return true;
        }

        private static bool 金币或元宝商城是打开的(挂机人物_ 人物)
        {
            var 结果 = 其他_.循环判断(() =>
            {
                return 图像_.查找文字(339, 574, 420, 597, s => s.Contains("元宝余额")).X != -1;
            }, 2);
            if (结果) 人物.输出("元宝商城是打开的");
            return 结果;
        }

        private static bool 打开金币商城(挂机人物_ 人物)
        {
            if (!金币或元宝商城是打开的(人物))
            {
                打开元宝商城(人物);
                键鼠_.左键单击(454, 253);
                var 找到 = 其他_.循环判断(() => 图像_.查找文字("随机神石", 606, 283, 678, 302).X != -1, 2);
                if (!找到) throw new Exception("金币商城打开失败");
                return 找到;
            }
            var 是在第一页 = 其他_.循环判断(() => 图像_.查找文字("随机神石", 606, 283, 678, 302).X != -1, 2);
            if (!是在第一页)
            {
                键鼠_.左键单击(373, 253);
                其他_.延迟(其他_.时长_400);
                键鼠_.左键单击(454, 253);
                是在第一页 = 其他_.循环判断(() => 图像_.查找文字("随机神石", 606, 283, 678, 302).X != -1, 2);
            }
            return 是在第一页;
        }

        private static bool 月卡或封号礼包可能打开了(挂机人物_ 人物)
        {
            var 结果 =
            其他_.循环判断(() => 图像_.查找文字("值", 984, 233, 1008, 253).X != -1, 2) &&
            其他_.循环判断(() => 图像_.查找文字("城", 984, 357, 1008, 379).X != -1, 2) &&
            其他_.循环判断(() => 图像_.查找文字("月", 984, 437, 1008, 459).X != -1, 2);
            if (结果) 人物.输出("月卡或封号礼包可能打开了");
            return 结果;
        }

        public static bool 关闭商城(挂机人物_ 人物)
        {
            if (月卡或封号礼包可能打开了(人物))
            {
                键鼠_.左键单击(954, 183);
                其他_.延迟(其他_.时长_1000);
                var 结果 = !月卡或封号礼包可能打开了(人物);
                if (!结果) throw new Exception("商城关闭失败");
                return 结果;
            }
            return true;
        }

        private static bool 购买商品(挂机人物_ 人物, string 名称, int 数量)
        {
            var 找到 = 其他_.循环判断(() => 图像_.查找文字(568, 264, 713, 293, s => s.Contains(名称)).X != -1, 2);
            if (!找到) throw new Exception("没找到" + 名称);
            人物.输出("购买 " + 数量 + "个 " + 名称);
            其他_.延迟(其他_.时长_400);
            for (var i = 1; i < 数量; i++)
            {
                键鼠_.左键单击(743, 435);
                其他_.延迟(其他_.时长_1000);
            }
            键鼠_.左键单击(644, 512);
            其他_.延迟(其他_.时长_1000);
            找到 = 其他_.循环判断(() => 图像_.查找文字(568, 264, 713, 293, s => s.Contains(名称)).X != -1, 2);
            if (找到) throw new Exception("没能关闭小的购买窗口");
            return !找到;
        }

        public static bool 购买第一页物品(挂机人物_ 人物, List<物品及数量_> 物品)
        {
            foreach (var a in 物品)
            {
                if (a.名称 == "回城石")
                {
                    var 结果 = 购买回城石(人物, a.数量);
                    if (!结果) return false;
                }
                else if (a.名称 == "随机神石")
                {
                    var 结果 = 购买随机神石(人物, a.数量);
                    if (!结果) return false;
                }
                else if (a.名称 == "冰泉圣水")
                {
                    var 结果 = 购买冰泉圣水(人物, a.数量);
                    if (!结果) return false;
                }
                else
                {
                    var 结果 = 购买道尊神符(人物, a.数量);
                    if (!结果) return false;
                }
            }
            return true;
        }
        public static bool 购买第二页物品(挂机人物_ 人物, List<物品及数量_> 物品)
        {
            foreach (var a in 物品)
            {
                if (a.名称 == "道尊红毒")
                {
                    var 结果 = 购买红毒(人物, a.数量);
                    if (!结果) return false;
                }
                else if (a.名称 == "道尊绿毒")
                {
                    var 结果 = 购买绿毒(人物, a.数量);
                    if (!结果) return false;
                }
                else if (a.名称 == "雄偶")
                {
                    var 结果 = 购买雄偶(人物, a.数量);
                    if (!结果) return false;
                }
                else
                {
                    var 结果 = 购买雌偶(人物, a.数量);
                    if (!结果) return false;
                }
            }
            return true;
        }
        private static bool 购买冰泉圣水(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开金币商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            键鼠_.左键单击(643, 413);
            var 成功 = 购买商品(人物, "冰泉圣水", 数量); 
            if (成功) 人物.冰泉次数 += 5;
            return 成功;
        }

        private static bool 购买随机神石(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开金币商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(643, 291);
            var 成功 = 购买商品(人物, "随机神石", 数量);
            if (成功) 人物.随机次数 += 100;
            return 成功;
        }

        private static bool 购买回城石(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开金币商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(434, 291);
            return 购买商品(人物, "回城石", 数量);
        }

        private static bool 购买道尊神符(挂机人物_ 人物, int 数量)
        {
            var 找到 = 打开金币商城(人物);
            if (!找到) throw new Exception("打开商城失败");
            其他_.延迟(其他_.时长_400);
            键鼠_.左键单击(850, 531);
            var 成功 = 购买商品(人物, "道尊神符", 数量);
            if (成功) 人物.道符次数 += 10000;
            return 成功;
        }

        private static bool 打开商城第二页(挂机人物_ 人物)
        {
            var 找到 = 元宝或金币商城打开了(人物);
            if (!找到) 找到 = 打开金币商城(人物);
            if (找到)
            {
                找到 = 其他_.循环判断(() => 图像_.查找文字("随机神石", 606, 283, 678, 302).X != -1, 2);
                if (找到)
                {
                    键鼠_.移动鼠标(952, 533);
                    其他_.延迟(其他_.时长_400);
                    键鼠_.左键按下();
                    其他_.延迟(其他_.时长_400);
                    键鼠_.移动鼠标(952, 370);
                    其他_.延迟(其他_.时长_400);
                    键鼠_.移动鼠标(952, 290);
                    其他_.延迟(其他_.时长_600);
                    键鼠_.左键抬起();
                    其他_.延迟(其他_.时长_1000);
                }
            }
            找到 = 其他_.循环判断(() => 图像_.查找文字("道尊神符", 815, 282, 885, 304).X != -1, 2) &&
                   其他_.循环判断(() => 图像_.查找文字(378, 521, 493, 543, s => s.Contains("超级") && s.Contains("稻草")).X != -1, 2);
            return 找到;
        }
        private static bool 购买绿毒(挂机人物_ 人物, int 数量)
        {
            var 打开 = 打开商城第二页(人物);
            if (!打开) throw new Exception("没打开商城第二页");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(434, 414);
            var 成功 = 购买商品(人物, "道尊灵毒", 数量);
            if (成功) 人物.绿毒次数 += 2000;
            return 成功;
        }
        private static bool 购买红毒(挂机人物_ 人物, int 数量)
        {
            var 打开 = 打开商城第二页(人物);
            if (!打开) throw new Exception("没打开商城");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(635, 414);
            var 成功 = 购买商品(人物, "道尊灵毒", 数量);
            if (成功) 人物.红毒次数 += 2000;
            return 成功;
        }
        private static bool 购买雄偶(挂机人物_ 人物, int 数量)
        {
            var 打开 = 打开商城第二页(人物);
            if (!打开) throw new Exception("没打开商城");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(843, 414);
            var 成功 = 购买商品(人物, "稻草人", 数量);
            if (成功) 人物.绿毒次数 += 2000;
            return 成功;
        }
        private static bool 购买雌偶(挂机人物_ 人物, int 数量)
        {
            var 打开 = 打开商城第二页(人物);
            if (!打开) throw new Exception("没打开商城");
            其他_.延迟(其他_.时长_400);

            键鼠_.左键单击(434, 530);
            var 成功 = 购买商品(人物, "稻草人", 数量);
            if (成功) 人物.红毒次数 += 2000;
            return 成功;
        }
    }
}
